﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Web.Mail;
using System.Web;
using System.Web.UI;
using Microsoft.SharePoint;
using System.DirectoryServices;
using System.Diagnostics;

namespace AprovaMembroComunidade
{
    public class AprovaMembro : SPItemEventReceiver
    {
        //Envia E-mail de nova Solicitação de Cadastro - Membro Comunidade
        public override void ItemAdded(SPItemEventProperties properties)
        {
            try
            {
                SPSecurity.RunWithElevatedPrivileges(delegate()
                {
                    String bodyMail = null;
                    try
                    {
                        SPListItem item = properties.ListItem;
                        bodyMail = "<b>Nova solicitação de cadastro para Comunidade Portal ABDI</b> " + "<br/><br/>";

                        if (item["Title"] != null)
                        {
                            bodyMail += "Nome: " + item["Title"].ToString() + " " + item["Sobre_x0020_nome"].ToString() + "<br/>";
                        }

                        if (item["Telefone"] != null)
                        {
                            bodyMail += "Telefone: " + item["Telefone"].ToString() + "<br/>";
                        }

                        if (item["Empresa"] != null)
                        {
                            bodyMail += "Empresa: " + item["Empresa"].ToString() + "<br/>";
                        }

                        if (item["Cargo"] != null)
                        {
                            bodyMail += "Cargo: " + item["Cargo"].ToString() + "<br/>";
                        }

                        if (item["E_x002d_mail"] != null)
                        {
                            bodyMail += "E-mail: " + item["E_x002d_mail"].ToString() + "<br/>";
                        }

                        if (item["Cadastro_x0020_Aprovado"] != null)
                        {
                            bodyMail += "Cadastro Aprovado: " + item["Cadastro_x0020_Aprovado"].ToString() + "<br/>";
                        }

                        bodyMail += "<br/>" + "<br/>" + "*Cadastro em processo de aprovação.";


                        try
                        {
                            MailMessage mail = new MailMessage();

                            mail.To = "sbd@abdi.com.br";
                            //mail.Cc = item["E_x002d_mail"].ToString();
                            mail.Cc = "ateste@abdi.com.br";
                            mail.From = "sbd@abdi.com.br";
                            mail.Subject = "Solicitação de Cadastro: Membro da Comunidade Portal ABDI";
                            mail.BodyFormat = MailFormat.Html;
                            mail.Body = bodyMail;

                            SmtpMail.SmtpServer = "correio.abdi.com.br";
                            SmtpMail.Send(mail);
                        }
                        catch (Exception e)
                        {
                            EventLog.WriteEntry("Feature Membro Comunidade - Incluir Item", "Erro ao enviar e-mail: Cc:'" + item["E_x002d_mail"].ToString() + "' - to:'sbd@abdi.com.br' - body:'" + bodyMail + "' - " + e.ToString(), EventLogEntryType.Error);
                        }

                    }
                    catch (Exception e)
                    {
                        EventLog.WriteEntry("Feature Membro Comunidade - Incluir Item", "SPListItem, erro ao carregar os dados da lista: " + e.ToString(), EventLogEntryType.Error);

                        MailMessage sendMail = new MailMessage();

                        //sendMail.To = mail;
                        sendMail.To = "sbd@abdi.com.br";
                        sendMail.From = "sbd@abdi.com.br";
                        sendMail.Subject = "Erro:Cadastro Membro Comunidade";
                        sendMail.BodyFormat = MailFormat.Html;
                        bodyMail = "<b>Erro:</b> não foi possivel cadastrar a solicitação de acesso.";
                        sendMail.Body = bodyMail;

                        SmtpMail.SmtpServer = "correio.abdi.com.br";
                        SmtpMail.Send(sendMail);
                    }
                });

            }
            catch (Exception e)
            {
                EventLog.WriteEntry("Feature Membro Comunidade - Incluir Item", "Erro ao incluir uma nova solicitação: " + e.ToString(), EventLogEntryType.Error);
            }

        }

        //Aprova cadastro da solicitação de acesso - Membro Comunidade
        /*
        public override void ItemUpdating(SPItemEventProperties properties)
        {
            EventLog.WriteEntry("Feature Membro Comunidade - ItemUpdating", "Evendo ItemUpdating", EventLogEntryType.Warning);
            base.ItemUpdating(properties);
        }
        */

        //Aprova cadastro da solicitação de acesso - Membro Comunidade
        public override void ItemUpdated(SPItemEventProperties properties)
        {
            EventLog.WriteEntry("Feature Membro Comunidade - ItemUpdated", "Evendo ItemUpdated", EventLogEntryType.Warning);
            //base.ItemUpdating(properties);
            SPSite siteColl = new SPSite(properties.SiteId);
            SPWeb site = siteColl.OpenWeb(properties.RelativeWebUrl);

            SPListItem item = properties.ListItem;

            EventLog.WriteEntry("Feature Membro Comunidade - SPListItem", "Evendo SPListItem", EventLogEntryType.Warning);

            try
            {
                if (item["Cadastro Aprovado"].ToString().ToUpper() == "SIM" && item["Conta de acesso"] == null)
                {

                    EventLog.WriteEntry("Feature Membro Comunidade - Cadastro Aprovado", "Evendo Cadastro Aprovado", EventLogEntryType.Warning);
                    try
                    {
                        SPSecurity.RunWithElevatedPrivileges(delegate()
                        {
                            using (SPSite ElevatedsiteColl = new SPSite(siteColl.ID))
                            {
                                using (SPWeb ElevatedSite = ElevatedsiteColl.OpenWeb(site.ID))
                                {
                                    //Colaboração
                                    /*
                                        SPRoleDefinitionCollection webroledefinitions = ElevatedSite.RoleDefinitions;
                                        foreach (SPRoleDefinition roleDefinition in webroledefinitions)
                                        {
                                            EventLog.WriteEntry("Feature Membro Comunidade - RoleDefinition", "Role: " + roleDefinition.Name, EventLogEntryType.Warning);
                                        }
                                    */


                                    //spSite = new SPSite(strSiteURL);
                                    // spWeb = spSite.OpenWeb();

                                    //Assign role and add user to site

                                    EventLog.WriteEntry("Feature Membro Comunidade - Valida Dados", "Evendo Valida Aprovado", EventLogEntryType.Warning);

                                    string[] username = item["E_x002d_mail"].ToString().Split('@');
                                    string sam = username[0];

                                    string givenName = item["Title"].ToString();
                                    string sn = item["Sobre_x0020_nome"].ToString();
                                    string mail = item["E_x002d_mail"].ToString();

                                    string telephoneNumber = null;
                                    string description = null;
                                    string physicalDeliveryOfficeName = null;

                                    if (item["Telefone"] != null)
                                    {
                                        telephoneNumber = item["Telefone"].ToString();
                                    }

                                    if (item["Empresa"] != null)
                                    {
                                        physicalDeliveryOfficeName = item["Empresa"].ToString();
                                    }

                                    if (item["Cargo"] != null)
                                    {
                                        description = item["Cargo"].ToString(); ;
                                    }

                                    EventLog.WriteEntry("Feature Membro Comunidade - Carrega String AD", "Carrega String AD", EventLogEntryType.Warning);

                                    string connectionPrefix = "LDAP://OU=Membros Comunidade Portal ABDI,DC=extranet,DC=abdi,DC=com,DC=br";
                                    DirectoryEntry dirEntry = new DirectoryEntry(connectionPrefix, "svcsharepoint", "P@ssw0rd");
                                    DirectoryEntry newUser = dirEntry.Children.Add("CN=" + username[0], "user");

                                    EventLog.WriteEntry("Feature Membro Comunidade - Cria Usuario 1", "Cria Usuario 1", EventLogEntryType.Warning);

                                    newUser.Properties["samAccountName"].Value = sam;
                                    newUser.Properties["name"].Value = username[0];
                                    newUser.Properties["DisplayName"].Value = username[0];
                                    newUser.Properties["userPrincipalName"].Value = sam + "@extranet.abdi.com.br";


                                    //first name
                                    newUser.Properties["givenName"].Value = givenName;

                                    //last name
                                    newUser.Properties["sn"].Value = sn;

                                    EventLog.WriteEntry("Feature Membro Comunidade - Cria Usuario 2", "Cria Usuario 2", EventLogEntryType.Warning);

                                    //Telefone
                                    if (telephoneNumber != null)
                                    {
                                        newUser.Properties["telephoneNumber"].Value = telephoneNumber;
                                    }

                                    //Descricao - Cargo
                                    if (description != null)
                                    {
                                        newUser.Properties["description"].Value = description;
                                    }
                                    //Empresa
                                    if (physicalDeliveryOfficeName != null)
                                    {
                                        newUser.Properties["physicalDeliveryOfficeName"].Value = physicalDeliveryOfficeName;
                                    }

                                    //Email
                                    newUser.Properties["mail"].Value = mail;

                                    //enable account = 544
                                    //disable account = 546
                                    newUser.Properties["UserAccountControl"].Value = 544;
                                    EventLog.WriteEntry("Feature Membro Comunidade - Cria Usuario 3", "Cria Usuario 3", EventLogEntryType.Warning);
                                    newUser.CommitChanges();
                                    EventLog.WriteEntry("Feature Membro Comunidade - Cria Usuario 4", "Cria Usuario 4", EventLogEntryType.Warning);
                                    //Atribui Password Padrao para os usuarios
                                    string passAbdi = "P@ssw0rd@abdi";
                                    newUser.Invoke("SetPassword", new object[] { passAbdi });
                                    EventLog.WriteEntry("Feature Membro Comunidade - Cria Usuario 5", "Cria Usuario 5", EventLogEntryType.Warning);
                                    newUser.CommitChanges();
                                    EventLog.WriteEntry("Feature Membro Comunidade - Cria Usuario 6", "Cria Usuario 6", EventLogEntryType.Warning);
                                    newUser.Properties["UserAccountControl"].Value = 65536;
                                    newUser.CommitChanges();
                                    EventLog.WriteEntry("Feature Membro Comunidade - Cria Usuario 7", "Cria Usuario 7", EventLogEntryType.Warning);
                                    dirEntry.Close();
                                    newUser.Close();
                                    EventLog.WriteEntry("Feature Membro Comunidade - Cria Usuario 8", "Cria Usuario 8", EventLogEntryType.Warning);
                                    try
                                    {
                                        item["Conta de acesso"] = username[0];
                                        this.DisableEventFiring();
                                        item.Update();
                                        this.EnableEventFiring();
                                    }
                                    catch
                                    {
                                        properties.Cancel = true;
                                    }
                                    EventLog.WriteEntry("Feature Membro Comunidade - Cria Usuario 9", "Cria Usuario 9", EventLogEntryType.Warning);

                                    SPUser spReturn;
                                    SPRoleAssignment spRoleAssignment = new SPRoleAssignment("extranet\\" + username[0], mail, givenName, "");
                                    //Using Contribute, might need high access

                                    EventLog.WriteEntry("Feature Membro Comunidade - Cria Usuario 10", "Cria Usuario 10", EventLogEntryType.Warning);

                                    SPRoleDefinition spSPRoleDefinition = ElevatedSite.RoleDefinitions["Colaboração"];

                                    spRoleAssignment.RoleDefinitionBindings.Add(spSPRoleDefinition);
                                    ElevatedSite.RoleAssignments.Add(spRoleAssignment);


                                    //Update site

                                    ElevatedSite.Update();
                                    spReturn = ElevatedSite.AllUsers["extranet\\" + username[0]];

                                    SPGroup spGroup = ElevatedSite.SiteGroups["Membros da Camunidade"];

                                    //Add and update group with new user

                                    spGroup.AddUser(spReturn.LoginName, spReturn.Email, spReturn.Name, "Added by UserControl");
                                    spGroup.Update();

                                    //EventLog.WriteEntry("Feature Membro Comunidade - spGroup", "Usuario Criado com Sucesso", EventLogEntryType.Warning);

                                    try
                                    {
                                        String bodyMail = null;
                                        MailMessage sendMail = new MailMessage();

                                        //sendMail.To = mail;
                                        sendMail.To = "ateste@abdi.com.br";
                                        sendMail.Cc = "sbd@abdi.com.br";
                                        sendMail.From = "sbd@abdi.com.br";
                                        sendMail.Subject = "Aprovação de Cadastro: Membro da Comunidade Portal ABDI";
                                        sendMail.BodyFormat = MailFormat.Html;
                                        bodyMail = "<b>" + givenName + "</b>, bem vindo ao Portal Abdi.<br/><br/>";
                                        bodyMail += "Seu cadastro foi aprovado com sucesso, utilize as seguintes informações para acesso:<br/>";
                                        bodyMail += "Usuário: extranet\\" + username[0] + "<br/>";
                                        bodyMail += "Senha: " + passAbdi + "<br/><br/>";

                                        bodyMail += "Acesse suas informações.<br/>";
                                        bodyMail += "www.abdi.com.br/forum<br/>";
                                        sendMail.Body = bodyMail;

                                        SmtpMail.SmtpServer = "correio.abdi.com.br";
                                        SmtpMail.Send(sendMail);
                                    }
                                    catch (Exception e)
                                    {
                                        //Cancela o update
                                        //item["Conta de acesso"] = "";
                                        //item["Cadastro Aprovado"] = "Não";

                                        //this.DisableEventFiring();
                                        //item.Update();                                        
                                        //this.EnableEventFiring();
                                        properties.Cancel = true;
                                        EventLog.WriteEntry("Feature Membro Comunidade - Aprovar Cadastro", "Erro ao enviar e-mail: " + e.ToString(), EventLogEntryType.Error);
                                    }
                                }
                            }
                        });
                    }
                    catch (Exception e)
                    {
                        //Cancela o update
                        //item["Conta de acesso"] = "";
                        //item["Cadastro Aprovado"] = "Não";

                        //this.DisableEventFiring();
                        //item.Update();                        
                        //this.EnableEventFiring();

                        properties.Cancel = true;

                        EventLog.WriteEntry("Feature Membro Comunidade - Aprovar Cadastro", "Cadastro aprovado: " + item["Cadastro Aprovado"].ToString() + ", Erro ao validar os dados do usuario: " + e.ToString(), EventLogEntryType.Error);
                        MailMessage sendMail = new MailMessage();
                        string bodyMail = null;
                        //sendMail.To = mail;
                        sendMail.To = "ateste@abdi.com.br";
                        sendMail.From = "sbd@abdi.com.br";
                        sendMail.Subject = "Erro: Aprovar Membro Comunidade";
                        sendMail.BodyFormat = MailFormat.Html;
                        bodyMail = "<b>Erro ao validar os dados do usuario.</b>";
                        sendMail.Body = bodyMail;

                        SmtpMail.SmtpServer = "correio.abdi.com.br";
                        SmtpMail.Send(sendMail);
                    }
                }
            }
            catch (Exception e)
            {
                //Cancela o update
                //item["Conta de acesso"] = "";
                //item["Cadastro Aprovado"] = "Não";

                //this.DisableEventFiring();
                //item.Update();                
                //this.EnableEventFiring();

                properties.Cancel = true;

                EventLog.WriteEntry("Feature Membro Comunidade - Aprovar Cadastro", "Erro ao aprovar o cadastro do usuario: ItemUpdated SPItemEventProperties - " + e.ToString(), EventLogEntryType.Error);

                MailMessage sendMail = new MailMessage();
                string bodyMail = null;
                //sendMail.To = mail;
                sendMail.To = "ateste@abdi.com.br";
                sendMail.From = "sbd@abdi.com.br";
                sendMail.Subject = "Erro: Aprovar Membro Comunidade";
                sendMail.BodyFormat = MailFormat.Html;
                bodyMail = "<b>Erro ao aprovar o cadastro do usuário.</b>";
                sendMail.Body = bodyMail;

                SmtpMail.SmtpServer = "correio.abdi.com.br";
                SmtpMail.Send(sendMail);
            }

        }
    }


}
